package cn.iocoder.yudao.module.todo.controller.admin.tasks;

import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import org.springframework.validation.annotation.Validated;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;

import javax.validation.*;
import java.util.*;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;

import cn.iocoder.yudao.module.todo.controller.admin.tasks.vo.*;
import cn.iocoder.yudao.module.todo.dal.dataobject.tasks.TasksDO;
import cn.iocoder.yudao.module.todo.service.tasks.TasksService;

/**
 * 待办角色
 * 待办中的角色包括创建人、执行人、参与人。
 *
 * 创建人，即创建待办的人，默认为待办的参与人，可以修改、完成、删除待办。用户创建的未完成待办在视图“我发起的”中。
 *
 * 执行人，即待办的执行人，逾期将会提醒执行者，执行人可以完成、删除待办。待办支持多执行人，每个执行人可以完成自己的任务；当创建人完成任务后，每个执行人的任务都会被完成。用户作为执行人的未完成待办在视图“进行中”。
 *
 * 参与人，即参与待办的人。参与人的待办在“我参与的”中展示，待办逾期不会提醒参与者，参与人不能修改、完成待办，可以评论待办，具有跟进、抄送的作用。用户作为参与人的未完成待办在视图“我参与的”中。
 */

@Tag(name = "管理后台 - 待办任务")
@RestController
@RequestMapping("/todo/tasks")
@Validated
public class TasksController {

    @Resource
    private TasksService tasksService;

    @PostMapping()
    @Operation(summary = "创建待办任务")
    public CommonResult<Long> createTasks(@Valid @RequestBody TasksCreateReqVO createReqVO) {
        return success(tasksService.createTasks(createReqVO));
    }

    @PutMapping("/{taskId}")
    @Operation(summary = "更新待办任务")
    public CommonResult<Boolean> updateTasks(@PathVariable("taskId") Long taskId, @Valid @RequestBody TasksSaveReqVO updateReqVO) {
        tasksService.updateTasks(taskId, updateReqVO);
        return success(true);
    }

    @PutMapping("/batch_complete")
    @Operation(summary = "待办任务执行者批量完成任务")
    public CommonResult<Boolean> batchUpdateTasksExecutors(@Valid @RequestBody List<Long> taskIds) {
        tasksService.completeTasks(taskIds);
        return success(true);
    }

    @PutMapping("/{taskId}/complete")
    @Operation(summary = "待办任务执行者完成单个任务")
    public CommonResult<Boolean> updateTasksExecutors(@PathVariable("taskId") Long taskId) {
        tasksService.completeTask(taskId);
        return success(true);
    }

    @DeleteMapping("/{taskId}")
    @Operation(summary = "删除待办任务")
    @Parameter(name = "taskId", description = "编号", required = true)
    public CommonResult<Boolean> deleteTasks(@PathVariable("taskId") Long id) {
        tasksService.deleteTasks(id);
        return success(true);
    }

    @GetMapping("/{id}")
    @Operation(summary = "获得待办任务")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    public CommonResult<TasksRespVO> getTasks(@PathVariable("id") Long id) {
        TasksDO tasks = tasksService.getTasks(id);
        return success(BeanUtils.toBean(tasks, TasksRespVO.class));
    }

    @GetMapping("/page")
    @Operation(summary = "获得待办任务分页")
    public CommonResult<PageResult<TasksRespVO>> getTasksPage(@Valid TasksPageReqVO pageReqVO) {
        PageResult<TasksDO> pageResult = tasksService.getTasksPage(pageReqVO);
        return success(BeanUtils.toBean(pageResult, TasksRespVO.class));
    }
}